<?php

namespace Drinkiit\BlogBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Drinkiit\BlogBundle\Form\MemberCommandeType;
use Drinkiit\BlogBundle\Form\MemberArticleType;
use Drinkiit\BlogBundle\Handler\MemberCommandeHandler;
use Drinkiit\BlogBundle\Entity\Commande;
use Drinkiit\BlogBundle\Entity\Article;

class MemberCommandeController extends Controller
{
	
	public function verif_commande_valideesAction()
	{
		
		$session = $this->getRequest()->getSession(); // on ouvre la session
		
		$user = $this->get('security.context')->getToken()->getUser() ; // on récupère l'utilisateur actif
		// ainsi que toutes ces commandes qui ne sont pas validées
		$liste_commandes = $this->getDoctrine()->getEntityManager()->getRepository('DrinkiitBlogBundle:Commande')
			->findBy( array('utilisateur_commande' => $user->getId(), 'validee' => false) ) ;
		$this->get('logger')->info("[INFO] Il y a ".count($liste_commandes)." commande(s) non validée(s) pour l'instant.") ;
		
		foreach ($liste_commandes as $key => $commande) { // pour chaque commande non validée
			
			$nb_comm = count($commande->getArticleCommande()) ; // on compte le nomnbre d'articles présents dans cette commande
			if ( $nb_comm == 0 ) // si il n'y a pas d'article dans cette commande
			{
				$this->get('logger')->info("[INFO] Il n'y a pas d'article dans la commande n°".$commande->getId().", donc on la supprime.") ;
				if ( $session->get('panier') == $commande->getId() ) // et si elle étais dans le panier actuel
				{
					$this->get('logger')->info("[INFO] En plus elle [commande n°".$commande->getId()."] est en session, donc on la supprime ici aussi.") ;
					$session->remove('panier') ; // on la supprime aussi en tant que panier
				}
				
				$this->getDoctrine()->getEntityManager()->remove($commande); // on supprime cette commande
			}
		}
		$this->getDoctrine()->getEntityManager()->flush(); // on valide tous les changements
		
		return true ;
	}
	
	public function indexAction($notification = '')
	{
		$session = $this->getRequest()->getSession(); // on ouvre la session
		
		if ( $session->has('panier') ) // si l'utilisateur a un panier, on va vouloir faire des choses avec
		{
			$this->get('logger')->info("[INFO] Commande n°".$session->get('panier')) ;
			$commande = $this->getDoctrine()->getEntityManager()->getRepository('DrinkiitBlogBundle:Commande')->find($session->get('panier')) ; // on récupère la commande
			
			// puis on test si elle est validée ou non !!!
			if ( $commande->getValidee() )
			{
				$this->get('logger')->info("[INFO] Commande n°".$session->get('panier')." validée.") ;
				$session->remove('panier') ; // elle est validée donc on y touche plus
			} else { // sinon il peut ajouté sans problèmes de nouveaux articles
				$this->get('logger')->info("[INFO] Commande n°".$session->get('panier')." en cours et pas encore validée.") ;
			}
			
		} else { // si pas de commande en cours, on va lui en créé une
			
			$user = $this->get('security.context')->getToken()->getUser() ;
			
			// on récupère toutes les commandes
			$liste_commandes = $this->getDoctrine()->getEntityManager()->getRepository('DrinkiitBlogBundle:Commande')->findAll() ;
			if ( count($liste_commandes) >= 2) // si il y a + de 2 commande non validées en cours, c'est louche...
			{ // ceci car les menus perso sont validés de base
				$this->get('logger')->info("[ERR] Il y a ".count($liste_commandes)." commande(s) non validée(s).") ;
			}
			
			$commande = $this->getDoctrine()->getEntityManager()->getRepository('DrinkiitBlogBundle:Commande')
			->findOneBy( array('utilisateur_commande' => $user->getId(), 'validee' => false) ) ;
			if ( is_object($commande) ) // si il en existe une dans ce cas
			{
				$this->get('logger')->info("[INFO] On a récupéré la dernière commande [".$commande->getId()."] non validée.") ;
				$session->set('panier', $commande->getId()) ; // on affecte la dernière commande en cours non validée à celle actuelle
			}
		}
		
		
		// dès l'arrivée sur la page on créé une nouvelle commande si il n'en existe pas déjà une
		if ( !$session->has('panier') )
		{
			$em = $this->getDoctrine()->getEntityManager();
			$user = $this->container->get('security.context')->getToken()->getUser() ; // récupération de l'user
			$commande = new Commande(); // création de la nouvelle commande
			$commande->setDateCommande(new \DateTime("now")) ; // on affecte une date provisiore
			$commande->setEstPayee(false) ; // la commande n'est pas payée par défaut
			$commande->setEstMenu(false) ; // n'est pas non plus un menu personnalisé
			$commande->setValidee(false) ; // evidemment pas validée
			$commande->setPrix(0) ; // avec un prix de 0
			$commande->setUtilisateurCommande($user) ; // on lui affecte ensuite l'utilisateur qui a effectué cette commande
			$em->persist($commande); // on l'enregistre en base
			$em->flush(); // on valide l'état de la base
			$session->set('panier', $commande->getId() ) ; // on lui ajoute dans le panier en session
			$this->get('logger')->info("[INFO] La commande n°".$session->get('panier')." vient d'être créée.") ;
		}
		//echo $session->get('panier') ;
		return ( $this->add_produitAction($notification) ) ;
	}
	
	public function add_produitAction($notification = '')
	{
		$session = $this->getRequest()->getSession(); // on ouvre la session
		
		$commande = $this->getDoctrine()->getEntityManager()->getRepository('DrinkiitBlogBundle:Commande')->find($session->get('panier')) ; // on récupère la commande
		$commande->setPrix($this->prixAction($session->get('panier'))) ;
		
		$note = $this->getRequest()->get('notification') ; // si une notification aurait été passé par la variable get
		if ( !empty($note) ) {
			$notification = $note ; // on va l'afficher à la place de celle en post
		}
		
		// on va afficher tous les produits possibles, de sorte qu'ils soient disponibles à la commande
		$liste_produit = $this->getDoctrine()->getEntityManager()->getRepository('DrinkiitBlogBundle:Produit')->findAll() ;
		$forms = Array() ; // la liste des formulaires pour chaque produit qui existe
		foreach ( $liste_produit as $key => $value) {
			$article = new Article();
			$article->setProduit($value) ;
			$form = $this->createForm(new MemberArticleType, $article);
			$formHandler = new MemberCommandeHandler($form, $this->get('request'), $this, $this->getDoctrine()->getEntityManager());
			$forms[$value->getId()] = $form->createView(); // puis on créé la vue du formulaire
		}
		
        if ( $formHandler->process() )
        {
            return $this->redirect( $this->generateUrl('member_commande') );
        }
		
		// on va passer la liste des types de produits qui sera le titre des catégories de produits sur le menu
		$liste_type_produit = $this->getDoctrine()->getEntityManager()->getRepository('DrinkiitBlogBundle:Type_produit')->findAll() ;
		
		// si un type de produit n'a pas encore de produit, on va pas l'ajouter...
		foreach($liste_type_produit as $key => $type_produit) {
			if (count($type_produit->getProduit()) == 0) {
				unset($liste_type_produit[$key]) ;
			}
		}
		$this->get('logger')->info("[INFO] Il y a ".count($liste_type_produit)." produits dans le site.") ;
		
		return $this->render('DrinkiitBlogBundle:Member:Commande.html.twig', array(
			'form' => $forms,
			'titre' => 'Commander un nouveau produit',
			'liste' => $liste_type_produit,
			'notification' => $notification,
		));
	}
	
	public function sup_produitAction($id=null)
	{
		// pour supprimer un produit
		$em = $this->getDoctrine()->getEntityManager() ;
		
		$session = $this->getRequest()->getSession(); // on ouvre la session
		$id_article = $this->getRequest()->get('article') ; // on récupère le numéro de l'article que l'on veut supprimer de la commande
		if ( $id != null )
		{
			$id_article = $id ;
		}
		
		$commande = $em->getRepository('DrinkiitBlogBundle:Commande')->find($session->get('panier')) ; // on récupère la commande
		$article = $em->getRepository('DrinkiitBlogBundle:Article')->find($id_article) ; // on récupère l'article
		
		$article_commande = $em->getRepository('DrinkiitBlogBundle:Article_commande')->findOneBy(array('type_article' => $id_article, 'article_commande' => $commande->getId() )) ; // on cherche le liens commande/article
		
		$em->remove($article_commande) ; // on supprime le liens entre commande et article commandé
		$commande->getArticleCommande()->removeElement($article_commande) ; // on supprime dans la commande
		$article->getArticleCommandeArt()->removeElement($article_commande) ; // et dans l'article
		$this->getDoctrine()->getEntityManager()->flush() ; // on valide tout ceci en base
		
		
		$this->get('logger')->info("[INFO] On a supprimé le produit de la commande.") ;
		$notification = 'Le produit a bien été supprimé.' ;
		
		return $this->redirect( $this->generateUrl('member_commande_add_produit', array('notification' => $notification) ) ) ;
	}
	
	public function valideAction()
	{
		
		$session = $this->getRequest()->getSession(); // on ouvre la session
		
		if ( $session->has('panier') ) // on regarde si il a une commande en cours
		{
			$this->get('logger')->info("[INFO] La commande n°".$session->get('panier')." qui doit être validée.") ;
			$commande = $this->getDoctrine()->getEntityManager()->getRepository('DrinkiitBlogBundle:Commande')->find($session->get('panier')) ; // on récupère la commande
			
			if ( count($commande->getArticleCommande()) == 0 ) // si il nous fais une farce
			{
				$this->get('logger')->info("[INFO] Commande n°".$session->get('panier')." n'a pas d'articles, inutile de valider.") ;
				$notification = 'Vous n\'aller tout de même pas valider une commande vide?' ;
				
			} else { // tous est rentré dans l'ordre
				
				if ( $commande->getValidee() ) // si elle est déjà validée, on ne revalide pas
				{
					$this->get('logger')->info("[INFO] Commande n°".$session->get('panier')." déjà validée.") ;
					$notification = 'Vous avez déjà validé cette commande.' ;
					
				} else { // sinon, on la valide, merci au revoir
					
					$this->get('logger')->info("[INFO] La commande n°".$session->get('panier')." a été validée.") ;
					$commande->setPrix($this->prixAction($session->get('panier'))) ;
					$commande->setEstMenu(false) ;
					$commande->setValidee(true) ;
					$commande->setDateCommande(new \DateTime("now")) ;
					$notification = 'Vous avez bien validé votre commande.' ;
				}
			}
			
		} else { // si il clique sur validé sans commande
			
			$this->get('logger')->info("[INFO] Commande n°".$session->get('panier')." n'éxiste pas, donc non validable.") ;
			$notification = 'Vous ne pouvez pas valider une commande inexistante.' ;
		}
		
		return $this->indexAction($notification) ;
	}
	
	public function menuAction()
	{
		// on veut mettre en menu perso une commande en cours
		
		$session = $this->getRequest()->getSession(); // on ouvre la session
		
		if ( $session->has('panier') ) // on regarde si il a une commande en cours
		{
			$this->get('logger')->info("[INFO] La commande n°".$session->get('panier')." qui doit être transformée en menu personalisé.") ;
			$commande = $this->getDoctrine()->getEntityManager()->getRepository('DrinkiitBlogBundle:Commande')->find($session->get('panier')) ; // on récupère la commande
			
			if ( count($commande->getArticleCommande()) == 0 ) // si il nous fais une farce
			{
				
				$this->get('logger')->info("[INFO] Commande n°".$session->get('panier')." n'a pas d'articles, inutile de l'enregistrer en temps que menu.") ;
				$notification = 'Vous n\'aller tout de même pas faire d\'une commande vide votre menu perso?' ;
				
			} else {
				
				if ( $commande->getEstMenu() ) // si elle est déjà un menu, on ne la remet pas
				{
					$this->get('logger')->info("[INFO] Commande n°".$session->get('panier')." déjà menu perso.") ;
					$notification = 'Cette commande est déjà un menu perso.' ;
					
				} else { // sinon, on la change en menu perso, merci au revoir
					
					$this->get('logger')->info("[INFO] La commande n°".$session->get('panier')." a été changée en menu perso.") ;
					$commande->setPrix($this->prixAction($session->get('panier'))) ;
					$commande->setEstMenu(true) ;
					$commande->setValidee(true) ;
					$notification = 'Vous avez bien crééer votre menu perso.' ;
				}
			}
			
		} else { // si il clique sur menu perso sans commande
		
			$this->get('logger')->info("[INFO] Commande n°".$session->get('panier')." n'éxiste pas, donc non transformable en menu.") ;
			$notification = 'Vous ne pouvez pas transformer en menu perso une commande inexistante.' ;
		}
		
		return $this->indexAction($notification) ;
	}
	
	public function mes_commandesAction()
	{
		// on veut afficher la liste des commandes de l'utilisateur
		$this->verif_commande_valideesAction() ;
		
		$user = $this->container->get('security.context')->getToken()->getUser() ;
		$liste_commandes = $this->getDoctrine()->getEntityManager()->getRepository('DrinkiitBlogBundle:Commande')
			->findBy( array('utilisateur_commande' => $user->getId(), 'est_menu' => false), array('validee' => 'desc', 'date_commande' => 'desc')) ; // on affiche toutes les commandes sauf celles qui sont des menus
		
		$this->get('logger')->info("[INFO] Affichage des ".count($liste_commandes)." commandes du membre.") ;
		return $this->render('DrinkiitBlogBundle:Member:Mes_commandes.html.twig', array(
			'titre' => 'Afficher mes commandes passées',
			'liste' => $liste_commandes,
		));
	}
	
	public function mes_menusAction()
	{
		// on veut afficher la liste des menus perso de l'utilisateur
		$this->verif_commande_valideesAction() ;
		
		$user = $this->container->get('security.context')->getToken()->getUser() ;
		$liste_menus = $this->getDoctrine()->getEntityManager()->getRepository('DrinkiitBlogBundle:Commande')
			->findBy( array('utilisateur_commande' => $user->getId(), 'est_menu' => true)) ;
		
		$this->get('logger')->info("[INFO] Affichage des ".count($liste_menus)." menus personnalisés du membre.") ;
		return $this->render('DrinkiitBlogBundle:Member:Mes_menus.html.twig', array(
			'titre' => 'Afficher mes menus perso',
			'liste' => $liste_menus,
		));
	}
	
	public function prixAction($id_comm)
	{
		// pour calculer le prix d'une commande
		$commande = $this->getDoctrine()->getEntityManager()->getRepository('DrinkiitBlogBundle:Commande')->find($id_comm) ;
		$prix = 0 ;
		
		foreach ( $commande->getArticleCommande() as $key => $art_commande ) { // pour chaque article commandé
			
			// on multiplie la quantité par le prix de chaque article commandé
			$prix += $art_commande->getTypeArticle()->getQuantite() * $art_commande->getTypeArticle()->getProduit()->getPrix() ;
		}
		
		$this->get('logger')->info("[INFO] La commande n°".$id_comm." vaut ".$prix." €.") ;
		return $prix*100 ;
		
	}
	
	public function recommandeAction($id_comm)
	{
		// pour recommander une commande déjà passée ou un menu perso
		$session = $this->getRequest()->getSession(); // on ouvre la session
		
		if ( $session->has('panier') ) // si on a pas de panier, on peut faire une recommande
		{
			$commande = $this->getDoctrine()->getEntityManager()->getRepository('DrinkiitBlogBundle:Commande')->find($id_comm) ; // on cherche la commande à copier
			$this->getDoctrine()->getEntityManager()->detach($commande) ; // on la détache pour la protéger
			$new_commande = clone($commande); // on la clone dans une nouvelle
			$new_commande->setId(null); // on réinit l'id de la commande
			$new_commande->setEstMenu(false); // mais ce n'est plus un menu si jamais il l'est
			$new_commande->setDateCommande(new \DateTime("now")) ; // la date de recommande, c'est today
			
			foreach ( $commande->getArticleCommande() as $key => $article_commande) { // pour chaque article commandé de celle d'avant
				$new_commande->addArticle_commande($article_commande) ; // on commande cet article pour la nouvelle commande
			}
			
			$this->getDoctrine()->getEntityManager()->persist($new_commande); // on ajoute la commande en base
			$this->getDoctrine()->getEntityManager()->merge($commande); // on récupère l'ancienne
			$this->getDoctrine()->getEntityManager()->flush(); // on valide en base
			
			$this->get('logger')->info("[INFO] La commande n°".$id_comm." a été recommandée en [".$new_commande->getId()."].") ;
			
			$session->get('panier', $new_commande->getId()) ; // on la rajoute dans la session juste pour la validationb
			return $this->valideAction() ; // on valide la commande !!!
			
		} else { // sinon on renvoie bye to user
			
			$this->get('logger')->info("[INFO] La commande n°".$id_comm." ne peut être recommandée car il y a une commande [".$session->get('panier')."] en cours.") ;
			return $this->add_produitAction("Votre panier n'est pas vide, videz le ou validez le avant.") ;
			
		}
	}
	
	public function sup_commandeAction()
	{
		$session = $this->getRequest()->getSession(); // on ouvre la session
		
		$commande = $this->getDoctrine()->getEntityManager()->getRepository('DrinkiitBlogBundle:Commande')->find($session->get('panier')) ; // on récupère la commande
		
		foreach ( $commande->getArticleCommande() as $article_commande ) {
			
			$this->sup_produitAction( $article_commande->getTypeArticle()->getId() ) ;
		}
		
		return $this->indexAction('Votre commande a bien été supprimée.') ;
	}
}
